home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PC_LIBS / C080.ZIP / US84.ARC / MODEM7.LIB < prev    next >
Text File  |  1979-12-31  |  14KB  |  679 lines

  1. ;MACROS LIBRARY FOR CP/M ROUTINE SIMULATION   10/08/80
  2.  
  3. ;CONTAINS:
  4. ;    1)   INBUF    - DUPLICATES READ BUFFER ROUTINE
  5. ;            SAME AS CP/M FUNCTION 10, BUT DOES
  6. ;            NOT USE CTRL-C (REASON FOR ROUTINE).
  7. ;            DOES ALLOW CONTROLS U, R, E, AND H (BACKSPACE).
  8. ;            OUTPUTS BELL IF INPUT GREATER THAN BUFFER
  9. ;    2)   CMDLINE  - PARSES A CP/M BUFFER INTO FORMAT SAME AS
  10. ;            CP/M COMMAND LINE.
  11. ;    3)   INLNCOMP - COMPARES STRINGS FOLLOWING CALL TO 'ILCOMP'
  12. ;                TO STRING ADDRESSED BY DE REGS.
  13. ;    4)   MULTNAME - MULTI-FILE FILE ACCESS ROUTINE FROM
  14. ;            CP/M USERS GROUP.
  15. ;    5)   DIRLIST  -    LISTS DIRECTORY
  16. ;    6)   MSGOUT   - OUTPUT A MESSAGE (MODEM8)
  17. ;
  18. INBUF    MACRO        ;NO PARAMETERS USED.
  19.  
  20.     LOCAL START,INBUFO,INBUFA,DELETE,NODEL,ALERT
  21.     LOCAL INBUFLT,CLEAR,CLEARL,INBUFR,RETYPE,BKSPC,PCRLF
  22.     LOCAL CONIN,CONOUT,CONIN1,CONOUT1,NOUCASE,CTLRLP
  23.     LOCAL CONSTAT,CONST1,CONINLP
  24.  
  25.     PUSH    PSW
  26.     PUSH    H
  27.     PUSH    B
  28.     PUSH    D        ;DE REGISTERS MUST BE PUSHED LAST
  29. START    CALL    CLEAR    ;CLEAR THE BUFFER AREA
  30.     POP    D        ;GET ADDRESS OF BUFFER ON RETRIES
  31.     PUSH    D        ;RESTORE STACK
  32.     XRA    A
  33.     INX    D        ;ADDRESS COUNT FIELD
  34.     STAX    D        ;INITIALIZE WITH A ZERO IN COUNT BYTE
  35.     INX    D
  36.     XCHG        ;ADDRESS    FIRST BUFFER BYTE WITH HL
  37. INBUFA    CALL    CONIN
  38.     CPI    0DH        ;IS IT A RETURN?
  39.     JZ    INBUFR    ;IF SO, THEN RETURN
  40.     CPI    7FH        ;IS IT A DELETE?
  41.     JZ    DELETE
  42.     CPI    8        ;CTRL-H WILL BACKSPACE..
  43.     JZ    DELETE    ;..OVER DELETED CHAR.
  44.     CPI    'U'-40H    ;IS IT A CTRL-U
  45.     JZ    INBUFO    ;OUTPUT # CR LF AND START OVER
  46.     CPI    'R'-40H    ;CTRL-R RETYPES LINE
  47.     JZ    RETYPE
  48.     CPI    'E'-40H
  49.     JZ    PCRLF
  50.     CPI    20H        ;NO CONTROL CHARACTERS OTHER..
  51.     JC    INBUFA    ;..THAN ABOVE ALLOWED.
  52.     MOV    B,A        ;SAVE INPUTTED CHARACTER
  53.     XCHG        ;SAVE    HL IN DE
  54.     POP    H        ;GET ADDRESS OF BUFFER IN HL
  55.     PUSH    H        ;RESTORE STACK
  56.     INX    H        ;ADDRESS COUNT BYTE
  57.     INR    M        ;INCREASE COUNT BYTE
  58.     DCX    H        ;ADDRESS MAXIMUM
  59.     MOV    A,M        ;PUT MAXIMUM IN A
  60.     INX    H        ;ADDRESS COUNT
  61.     CMP    M        ;COMPARE COUNT TO MAXIMUM
  62.     JC    ALERT    ;IF MAXIMUM, RING BELL AND WAIT FOR CR
  63.     XCHG        ;RESTORE    BUFFER POINTER TO HL
  64.     MOV    M,B        ;PUT INPUTTED CHARACTER IN BUFFER
  65.     MOV    A,B        ;OUTPUT IT
  66.     CALL    CONOUT
  67.     INX    H        ;BUMP POINTER
  68.     JMP    INBUFA    ;GET NEXT CHARACTER
  69.  
  70. DELETE    XCHG        ;SAVE    BUFFER POINTER IN DE
  71.     POP    H        ;ADDRESS BEGINNING OF BUFFER
  72.     PUSH    H        ;RESTORE STACK
  73.     INX    H        ;ADDRESS COUNT FIELD
  74.     MOV    B,A        ;SAVE DELETE CHAR - 7FH OR 08H
  75.     MOV    A,M
  76.     SUI    1        ;DECREASE COUNT
  77.     MOV    M,A
  78.     JC    NODEL    ;DON'T DELETE PAST BEGINING OF BUFFER.
  79.     XCHG        ;RESTORE    BUFFER POINTER TO HL
  80.     DCX    H        ;POINT TO LAST BYTE INPUTTED
  81.     MOV    A,B        ;GET BACK EITHER 7FH OR 08H
  82.     MOV    B,M        ;GET CHARACTER BEING DELETED
  83.     MVI    M,20H    ;RESTORE BLANK
  84.     JMP    BKSPC
  85. ;    AODC use backspace thing
  86. ;8    CPI    8
  87. ;8    JZ    BKSPC
  88. ;8    MOV    A,B        ;ECHO CHAR IF 7FH
  89. ;8    CALL    CONOUT
  90. ;8    JMP    INBUFA    ;GET NEXT CHARACTER
  91. NODEL    INR    M        ;DON'T LEAVE COUNT NEGATIVE
  92.     XCHG        ;RESTORE    POINTER TO HL
  93.     JMP    INBUFA
  94. BKSPC    MVI    A,8
  95.     CALL    CONOUT    ;TRUE ERASE IF 08H
  96.     MVI    A,20H
  97.     CALL    CONOUT
  98.     MVI    A,8
  99.     CALL    CONOUT
  100.     JMP    INBUFA
  101.  
  102. INBUFO    MVI    A,'#'
  103.     CALL    CONOUT
  104.     MVI    A,0DH
  105.     CALL    CONOUT
  106.     MVI    A,0AH
  107.     CALL    CONOUT
  108.     JMP    START
  109.  
  110. RETYPE    POP    D
  111.     PUSH    D
  112.     INX    D        ;POINT TO CURRENT NUMBER..
  113.     LDAX    D        ;..OF CHARACTERS.
  114.     MOV    B,A
  115.     MVI    A,'#'
  116.     CALL    CONOUT
  117.     MVI    A,0DH
  118.     CALL    CONOUT
  119.     MVI    A,0AH
  120.     CALL    CONOUT
  121.     MOV    A,B        ;TEST IF ZERO INPUT
  122.     ORA    A
  123.     JZ    INBUFA
  124. CTLRLP    INX    D
  125.     LDAX    D
  126.     CALL    CONOUT
  127.     DCR    B
  128.     JNZ    CTLRLP
  129.     JMP    INBUFA
  130.     
  131. ALERT    MVI    A,7
  132.     CALL    CONOUT
  133.     DCR    M
  134.     XCHG
  135.     JMP    INBUFA
  136.  
  137. PCRLF    MVI    A,0DH
  138.     CALL    CONOUT
  139.     MVI    A,0AH
  140.     CALL    CONOUT
  141.     JMP    INBUFA
  142.  
  143. INBUFR    MVI    A,0DH
  144.     CALL    CONOUT
  145.     MVI    A,0AH
  146.     CALL    CONOUT
  147.     POP    D
  148.     POP    B
  149.     POP    H
  150.     POP    PSW
  151.     RET
  152.  
  153. CLEAR    POP    D        ;ACCOUNTS FOR CALL
  154.     POP    H        ;ADDRESS BUFFER IN HL
  155.     PUSH    H        ;RESTORE..
  156.     PUSH    D        ;..STACK
  157.     MOV    B,M        ;SAVE MAXIMUM IN B
  158.     INX    H        ;POINT TO FIRST..
  159.     INX    H        ;..BUFFER BYTE.
  160.     MVI    A,20H
  161. CLEARL    MOV    M,A
  162.     INX    H
  163.     DCR    B
  164.     JNZ    CLEARL
  165.     RET
  166.  
  167. CONIN:    PUSH    H ! PUSH D ! PUSH B
  168.     CALL    CONIN1
  169.     CPI    61H        ;CHANGE TO UPPER..
  170.     JC    NOUCASE    ;..CASE SINCE CP/M..
  171.     CPI    7BH        ;..DOES THE SAME.
  172.     JNC    NOUCASE
  173.     ANI    5FH
  174. NOUCASE    POP    B ! POP D ! POP H
  175.     RET
  176. CONIN1    LHLD    1
  177.     LXI    D,6
  178.     DAD    D
  179.     PCHL
  180.  
  181. CONSTAT    PUSH    H ! PUSH D ! PUSH B
  182.     CALL    CONST1
  183.     POP    B ! POP D ! POP H
  184.     RET
  185. CONST1    LHLD    1
  186.     LXI    D,3
  187.     DAD    D
  188.     PCHL
  189.  
  190. CONOUT    PUSH    H ! PUSH D ! PUSH B ! PUSH PSW
  191.     CALL    CONOUT1
  192.     POP    PSW ! POP B ! POP D ! POP H
  193.     RET
  194. CONOUT1    LHLD    1
  195.     LXI    D,9
  196.     DAD    D
  197.     MOV    C,A
  198.     PCHL
  199.  
  200.     ENDM
  201.  
  202. CMDLINE    MACRO        ;NO    PARAMETERS USED
  203.  
  204. ;LOADS    A COMMAND LINE ADDRESSED BY DE REGISTERS (MAX # CHARACTERS IN LINE
  205. ;IN    DE, NUMBER OF CHARS IN LINE IN DE+1, LINE STARTS IN DE+2) INTO FCB
  206. ;ADDRESSED    BY HL REGISTERS. THE FCB SHOULD BE AT LEAST 33 BYTES IN LENGTH.
  207. ;THE    COMMAND LINE BUFFER MUST HAVE A MAXIMUM LENGTH OF AT LEAST ONE MORE
  208. ;THAN    THE GREATEST NUMBER OF CHARACTERS THAT WILL BE NEEDED.
  209.  
  210.     LOCAL    CMDLINE, DEFDR, DONE, DRIVE, FILL1, FILL, FILL2, INIT, INITL1
  211.     LOCAL    INITL2, INITL3, INITL4, NAME1, NAME2, SCAN, TRANS, TSTNAM
  212.     LOCAL    TSTTYP, TSTTYPL, TYPE1, TYPE2, NAME2C
  213.  
  214.  
  215.     PUSH    PSW
  216.     PUSH    B
  217.     PUSH    D
  218.     PUSH    H
  219.  
  220.     CALL    INIT    ;FILLS FCBS WITH BLANKS AND NULLS
  221.  
  222.     XCHG        ;GET    START OF COMMAND LINE IN HL.
  223.     INX    H        ;ADDRESS # BYTES IN CMD LINE.
  224.     MOV    E,M        ;LOAD DE PAIR WITH # BYTES.
  225.     MVI    D,0
  226.     INX    H
  227.     DAD    D        ;POINT TO BYTE AFTER LAST CHAR..
  228.     MVI    M,0DH    ;..IN CMD LINE AND STORE DELIMITER.
  229.     POP    H        ;RESTORE HL AND DE.
  230.     POP    D
  231.     PUSH    D
  232.     PUSH    H
  233.     INX    D        ;ADDRESS START OF COMMAND.
  234.     INX    D
  235.  
  236.     CALL    DRIVE
  237.  
  238. NAME1    MVI    C,8        ;TRANSFER FIRST FILENAME TO FCB.
  239.     CALL    TRANS
  240.     CPI    0DH
  241.     JZ    DONE
  242.     CPI    20H        ;IF SPACE, THEN START OF..
  243.     JZ    NAME2    ;..SECOND FILENAME.
  244.  
  245. TYPE1    POP    H        ;FILETYPE MUST BE AFTER..
  246.     PUSH    H        ;..EIGHTH BYTE OF NAME.
  247.     LXI    B,9
  248.     DAD    B
  249.     MVI    C,3        ;TRANSFER TYPE OF FIRST FILE
  250.     CALL    TRANS
  251.     CPI    0DH
  252.     JZ    DONE
  253.  
  254. NAME2    LDAX    D        ;EAT MULTIPLE SPACES..
  255.     CPI    20H        ;..BETWEEN NAMES.
  256.     JNZ    NAME2C
  257.     INX    D
  258.     JMP    NAME2
  259.     LDAX    D
  260.     CPI    0DH        ;TEST IF FIRST NAME..
  261.     JZ    DONE        ;..ONLY AND THEN SPACE.
  262. NAME2C    POP    H        ;SECOND NAME STARTS IN 16TH BYTE.
  263.     PUSH    H        ;POINT HL TO THIS BYTE.
  264.     LXI    B,16
  265.     DAD    B
  266.     CALL    DRIVE
  267.     MVI    C,8
  268.     CALL    TRANS
  269.     CPI    0DH
  270.     JZ    DONE
  271.  
  272. TYPE2    POP    H        ;SECOND TYPE STARTS IN 25TH BYTE.
  273.     PUSH    H
  274.     LXI    B,25
  275.     DAD    B
  276.     MVI    C,3
  277.     CALL    TRANS
  278.  
  279. DONE    POP    H
  280.     PUSH    H
  281.     INX    H        ;POINT TO FIRST CHAR OF FIRST NAME IN FCB.
  282.     CALL    SCAN    ;CHECK FOR * (AMBIGUOUS NAMES).
  283.     POP    H
  284.     PUSH    H
  285.     LXI    B,17    ;POINT TO FIRST CHAR OF SECOND NAME IN FCB.
  286.     DAD    B
  287.     CALL    SCAN
  288.     POP    H
  289.     POP    D
  290.     POP    B
  291.     POP    PSW
  292.     RET
  293.  
  294. ;    =============>>>  SUBROUTINES  <<===============
  295.  
  296. INIT    PUSH    H        ;INITIALIZES FCB WITH 1 NULL (FOR FIRST DRIVE),..
  297.     PUSH    B        ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE),..
  298.     MVI    M,0        ;..11 BLANKS, AND 4 NULLS.
  299.     INX    H
  300.     MVI    B,11
  301.     MVI    A,20H
  302.     CALL    INITFILL
  303.     MVI    B,5
  304.     MVI    A,0
  305.     CALL    INITFILL
  306.     MVI    B,11
  307.     MVI    A,20H
  308.     CALL    INITFILL
  309.     MVI    B,4
  310.     MVI    A,0
  311.     CALL    INITFILL
  312.     POP    B
  313.     POP    H
  314.     RET
  315.  
  316. INITFILL
  317.     MOV    M,A
  318.     INX    H
  319.     DCR    B
  320.     JNZ    INITFILL
  321.     RET
  322.  
  323. DRIVE    INX    D        ;CHECK 2ND BYTE OF FILENAME. IF IT..
  324.     LDAX    D        ;..IS A ":", THEN DRIVE WAS SPECIFIED.
  325.     DCX    D
  326.     CPI    ':'
  327.     JNZ    DEFDR    ;ELSE ZERO FOR DEFAULT DRIVE ('INIT' PUT ZERO)
  328.     LDAX    D
  329.     ANI    5FH
  330.     SUI    40H        ;CALCULATE DRIVE (A=1, B=2,...)..
  331.     MOV    M,A        ;..AND PLACE IT IN FCB.
  332.     INX    D        ;ADDRESS FIRST BYTE OF..
  333.     INX    D        ;..IN CMD LINE,..
  334. DEFDR    INX    H        ;..AND NAME FIELD IN FCB.
  335.     RET
  336.  
  337. TRANS    LDAX    D        ;TRANSFER FROM CMD LINE TO FCB..
  338.     INX    D        ;..UP TO NUMBER OF CHARS SPECIFIED..
  339.     CPI    0DH        ;..BY C-REG. KEEP SCANNING FIELD..
  340.     RZ        ;..WITHOUT    TRANSFER UNTIL A DELIMITING..
  341.     CPI    '.'        ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  342.     RZ        ;..C/R    (FOR END OF CMD LINE).
  343.     CPI    20H
  344.     RZ
  345.     DCR    C
  346.     JM    TRANS    ;ONCE C-REG IS LESS THAN ZERO, KEEP READING..
  347.     MOV    M,A        ;..CMD LINE BUT DO NOT TRANSFER TO FCB.
  348.     INX    H
  349.     JMP    TRANS
  350.  
  351. SCAN    MVI    B,8        ;SCAN FILE NAME ADDRESSED BY HL.
  352. TSTNAM    MOV    A,M
  353.     CPI    '*'        ;IF '*' FOUND, FILL IN REST OF FIELD..
  354.     JZ    FILL1    ;..WITH '?' FOR AMBIGUOUS NAME.
  355.     INX    H
  356.     DCR    B
  357.     JNZ    TSTNAM
  358.     JMP    TSTTYP
  359. FILL1    CALL    FILL
  360.  
  361. TSTTYP    MVI    B,3        ;SCAN AND FILL TYPE FIELD FOR NAME..
  362. TSTTYPL    MOV    A,M        ;..SPECIFIED ABOVE.
  363.     CPI    '*'
  364.     JZ    FILL2
  365.     INX    H
  366.     DCR    B
  367.     RZ
  368.     JMP    TSTTYPL
  369. FILL2    CALL    FILL
  370.     RET
  371.  
  372. FILL    MVI    M,'?'    ;ROUTINE TRANSFERS '?'.
  373.     INX    H
  374.     DCR    B
  375.     JNZ    FILL
  376.     RET
  377.  
  378.     ENDM
  379.  
  380. INLNCOMP    MACRO        ;NO    PARAMETERS USED
  381.  
  382. ;IN-LINE    COMPARE. COMPARES STRING ADDRESSED BY DE-REG TO STRING
  383. ;AFTER    CALL (ENDS WITH ZERO). RETURN WITH CARRY SET MEANS STRINGS
  384. ;NOT    THE SAME. ALL REGISTERS EXCEPT A-REG ARE UNAFFECTED.
  385.  
  386.     LOCAL    ILCOMPL, SAME, NOTSAME, NSLP
  387.  
  388.     XTHL        ;POINT    HL TO 1ST CHAR.
  389.     PUSH    D
  390. ILCOMPL    MOV    A,M        ;HL POINTS TO IN-LINE STRING.
  391.     ORA    A        ;END OF STRING IF ZERO.
  392.     JZ    SAME
  393.     LDAX    D
  394.     CMP    M
  395.     JNZ    NOTSAME
  396.     INX    H
  397.     INX    D
  398.     JMP    ILCOMPL
  399. NOTSAME    MVI    A,0        ;IF NOT SAME, FINISH THRU..
  400. NSLP    INX    H        ;..STRING SO RETURN WILL..
  401.     CMP    M        ;..GO TO INSTRUCTION AFTER..
  402.     JNZ    NSLP    ;..STRING AND NOT REMAINDER OF STRING.
  403.     STC
  404. SAME    POP    D
  405.     INX    H        ;AVOIDS A NOP INSTRUCTION..
  406.     XTHL        ;..WHEN    RETURNING.
  407.     RET
  408.  
  409.     ENDM
  410.  
  411. MFACCESS    MACRO    ;NO    PARAMETERS USED
  412.  
  413.     LOCAL    MOVE, CPM, MFNAME, MFN01, MFN02, MFFIX1, MFREQ
  414.     LOCAL    MFCUR, MOVER, SRCHF, SRCHN, STDMA, BDOS, FCB, FCBEXT
  415.     LOCAL    FCBRNO
  416.  
  417.     ;MFFLG1    IS NOT SET LOCAL BECAUSE IT MUST BE RESET
  418.     ;IN    MAIN MODEM PROGRAM ON AN ABORT
  419.  
  420. ;
  421. ;    MUST    BE ASSEMBLED BY "MAC"
  422. ;
  423. ;MULTI-FILE    ACCESS SUBROUTINE.  ALLOWS PROCESSING
  424. ;OF    MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  425. ;ROUTINE    BUILDS THE PROPER NAME IN THE FCB EACH
  426. ;TIME    IT IS CALLED.  THIS COMMAND WOULD BE USED
  427. ;IN    SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  428. ;ETC    IN WHICH YOU WANT TO PROCESS SINGLE OR
  429. ;MULTIPLE    FILES.
  430. ;
  431. ;THE    FCB WILL BE SET UP WITH THE NEXT NAME, READY TO
  432. ;DO    NORMAL PROCESSING (OPEN, READ, ETC.) WHEN ROUTINE IS CALLED.
  433. ;
  434. ;CARRY    IS SET IF NO MORE NAMES CAN BE FOUND
  435. ;
  436. ;DEFINE    DATA MOVE MACRO
  437. ;
  438. MOVE    MACRO    ?F,?T,?L,?I
  439.     IF    NOT    NUL ?F
  440.     LXI    H,?F
  441.     ENDIF
  442.     IF    NOT    NUL ?T
  443.     LXI    D,?T
  444.     ENDIF
  445.     IF    NOT    NUL ?L
  446.     LXI    B,?L
  447.     ENDIF
  448.     IF    NOT    NUL ?I
  449.     LOCAL    ?B,?Z
  450.     CALL    ?Z
  451. ?B    DB    ?I
  452. ?Z    POP    H    ;GET    TO
  453.     LXI    B,?Z-?B
  454.     ENDIF
  455.     CALL    MOVER
  456. MF    SET    -1    ;;SHOW    EXPANSION
  457.     ENDM
  458. ;
  459. ;DEFINE    CP/M MACRO - CPM FNC,PARM
  460. ;
  461. CPM    MACRO    ?F,?P
  462.     PUSH    B
  463.     PUSH    D
  464.     PUSH    H
  465.     IF    NOT    NUL ?F
  466.     MVI    C,?F
  467.     ENDIF
  468.     IF    NOT    NUL ?P
  469.     LXI    D,?P
  470.     ENDIF
  471.     CALL    BDOS
  472.     POP    H
  473.     POP    D
  474.     POP    B
  475.     ENDM
  476. ;
  477. ;------------------------------------------------
  478. ;
  479. ;    MULTI-FILE    ACCESS SUBROUTINE
  480. ;
  481. ;THE    ROUTINE IS COMMENTED IN PSEUDO CODE,
  482. ;EACH    PSEUDO CODE STATEMENT IS IN <<...>>
  483. ;
  484. MFNAME:
  485. ;<<INIT    DMA ADDR, FCB>>
  486.     CPM STDMA,80H
  487.     XRA A ! STA FCBEXT
  488. ;<<IF    FIRST TIME>>
  489.     LDA MFFLG1 ! ORA A ! JNZ MFN01
  490. ;     <<TURN OFF 1ST TIME SW>>
  491.     MVI A,1 ! STA MFFLG1
  492. ;     <<SAVE THE REQUESTED NAME>>
  493.     MOVE FCB,MFREQ,12 ;SAVE ORIG REQ
  494.     LDA FCB ! STA MFCUR ;SAVE DISK IN CURR FCB
  495. ;     <<SRCHF REQ NAME>>
  496.     MOVE MFREQ,FCB,12
  497.     CPM SRCHF,FCB
  498. ;<<ELSE>>
  499.     JMP MFN02
  500. MFN01:
  501. ;     <<SRCHF CURR NAME>>
  502.     MOVE MFCUR,FCB,12
  503.     CPM SRCHF,FCB
  504. ;     <<SRCHN REQ NAME>>
  505.     MOVE MFREQ,FCB,12
  506.     CPM SRCHN,FCB
  507. ;<<ENDIF>>
  508. MFN02:
  509. ;<<RETURN    CARRY IF NOT FOUND>>
  510.     INR A ! STC ! JNZ MFFIX1 ! STA MFFLG1 ! RET        ;FIX BY M.Z.
  511. MFFIX1:
  512. ;<<MOVE    NAME FOUND TO CURR>>
  513.     DCR A ! ANI 3 ! ADD A
  514.     ADD A ! ADD A ! ADD A ! ADD A
  515.     ADI 81H ! MOV L,A ! MVI H,0
  516.     PUSH H ;SAVE NAME POINTER
  517.     MOVE ,MFCUR+1,11
  518. ;<<MOVE    NAME FOUND TO FCB>>
  519.     POP H ! MOVE ,FCB+1,11
  520. ;<<SETUP    FCB>>
  521.     XRA A ! STA FCBEXT ! STA FCBRNO            ;FIX BY M.Z.
  522. ;<<RETURN>>
  523.     RET
  524. ;
  525. ;MULTI-FILE    ACCESS WORK AREA
  526. ;
  527. MFFLG1    DB    0    ;1ST    TIME SW
  528. MFREQ    DS    12    ;REQ    NAME
  529. MFCUR    DS    12    ;CURR    NAME
  530. ;------------------------------------------------
  531. ;
  532. ;MOVE    SUBROUTINE
  533. ;
  534. MOVER    MOV    A,M
  535.     STAX    D
  536.     INX    H
  537.     INX    D
  538.     DCX    B
  539.     MOV    A,B
  540.     ORA    C
  541.     JNZ    MOVER
  542.     RET
  543. ;
  544. ;EQUATES    USED BY MULTI-ACCESS SUBROUTINE
  545. ;
  546. SRCHF    EQU    17
  547. SRCHN    EQU    18
  548. STDMA    EQU    26                ;FIX    BY M.Z.
  549. BDOS    EQU    5
  550. FCB    EQU    5CH    
  551. FCBEXT    EQU    FCB+12
  552. FCBRNO    EQU    FCB+32
  553.     ENDM
  554.  
  555. DIRLIST    MACRO        ;NO    PARAMETERS USED
  556.  
  557.     LOCAL    DIRLP,PRTNAME,NOFILE,DIRDONE,QSTMARK,QSTLP,PRNTNAME,NEXTSR
  558.     LOCAL    MOVENAME,GETADD,DRIVE,CALCDR,SRCHFCB,NAMECT,PRNTHD,DRNAME
  559.  
  560.     LXI    D,CMDBUF    ;PUT COMMAND LINE IN FCB
  561.     LXI    H,5CH
  562.     CALL    CPMLINE
  563.     LXI    H,SRCHFCB
  564.     CALL    INITFCBS
  565.     LDA    6CH        ;GET DRIVE #
  566.     STA    SRCHFCB
  567.     LDA    6DH
  568.     CPI    20H        ;IF BLANK GET ALL NAMES
  569.     PUSH    PSW
  570.     CZ    QSTMARK
  571.     POP    PSW
  572.     CNZ    MOVENAME    ;ELSE MOVE NAME INTO FCB
  573.     CALL    DRIVE
  574.     LXI    D,80H
  575.     MVI    C,STDMA
  576.     CALL    BDOS
  577.     XRA    A
  578.     STA    NAMECT    ;CR AFTER 4 NAMES
  579.     LXI    D,SRCHFCB
  580.     MVI    C,SRCHF    ;DO FIRST SEARCH
  581.     CALL    BDOS
  582.     CPI    0FFH
  583.     JZ    NOFILE
  584.  
  585. DIRLP    CALL    GETADD
  586.     LXI    D,15    ;OFFSET FOR RECORD COUNT
  587.     DAD    D
  588.     MOV    A,M
  589.     ORA    A
  590.     JZ    NEXTSR    ;NO LIST IF FILE IS ZERO LENGTH
  591.     LXI    D,-5
  592.     DAD    D        ;POINT TO $SYS ATTRIB BYTE
  593.     MOV    A,M
  594.     ANI    80H
  595.     JNZ    NEXTSR    ;NO LIST IF $SYS FILE
  596.     LXI    D,-10
  597.     DAD    D        ;POINT TO BEGINNING OF NAME
  598.     INX    H        ;POINT TO FIRST LETTER
  599.     LXI    D,PRNTNAME
  600.     MVI    B,8
  601.     CALL    MOVE
  602.     INX    D
  603.     MVI    B,3
  604.     CALL    MOVE
  605.     CALL    ILPRT
  606. PRNTNAME
  607.     DB    '        ',' ','   ',  ' | ', 0   ;8,1,3 SPACES
  608.     LDA    NAMECT
  609.     INR    A
  610.     STA    NAMECT
  611.     ANI    03H
  612.     ORA    A
  613.     CZ    CRLF
  614. NEXTSR    LXI    D,SRCHFCB
  615.     MVI    C,SRCHN    ;DO NEXT SEARCH
  616.     CALL    BDOS
  617.     CPI    0FFH
  618.     JZ    DIRDONE
  619.     JMP    DIRLP
  620. NOFILE    CALL    ILPRT
  621.     DB    'NOT FOUND',0
  622. DIRDONE    CALL    CRLF
  623.     RET
  624.  
  625. QSTMARK    MVI    A,'?'    ;IF BLANK IN FCB, PUT IN 11 ?'s
  626.     MVI    B,11
  627.     LXI    H,SRCHFCB+1
  628. QSTLP    MOV    M,A
  629.     INX    H
  630.     DCR    B
  631.     JNZ    QSTLP
  632.     RET
  633.  
  634. MOVENAME
  635.     LXI    H,6DH
  636.     LXI    D,SRCHFCB+1
  637.     MVI    B,11
  638.     CALL    MOVE        ;MOVE IN CP/M PROGRAM
  639.     RET
  640.  
  641. GETADD    ANI    03H            ;GET MOD4 FOR CP/M 1.4
  642.     ADD    A ! ADD A ! ADD A    ;ADD 32
  643.     ADD    A ! ADD A
  644.     MOV    E,A
  645.     MVI    D,0
  646.     LXI    H,80H        ;ADD DMA OFFSET
  647.     DAD    D
  648.     RET
  649.  
  650. DRIVE    LDA    SRCHFCB        ;IF NO DRIVE, CAL
  651.     ORA    A            ;LOGGED IN DRIVE
  652.     JZ    CALCDR
  653.     ADI    40H
  654.     JMP    PRNTHD
  655. CALCDR    MVI    C,25
  656.     CALL    BDOS
  657.     ADI    41H
  658. PRNTHD    STA    DRNAME
  659.     CALL    ILPRT
  660.     DB    CR,LF,'DRIVE '
  661. DRNAME    DB    ' ',CR,LF,0
  662.     RET
  663.  
  664. SRCHFCB    DS    33
  665. NAMECT    DS    1
  666.     ENDM
  667.  
  668. MSGOUT    MACRO    ARG    ;    OUTPUT A MESSAGE
  669.     PUSH    H
  670.     PUSH    D
  671.     PUSH    B
  672.     LXI    D,ARG
  673.     MVI    C,9
  674.     CALL    5
  675.     POP    B
  676.     POP    D
  677.     POP    H
  678.     ENDM
  679.